<template>
  <section>模板方法模式</section>
</template>

<script>
/**
 * @Description:模板方法模式
 * @author ZY
 * @date 2022/11/23 22:41
 */
export default {
  name: "DesignTemplate",
  data() {
    return {}
  },
  created() {
    console.log('*******模板方法模式开始********')
    this.main()
    console.log('*******模板方法模式结束********')
  },
  methods: {
    /*
    * 模板方法模式：模板方法模式由两部分结构组成，第一部分是抽象父类，第二部分是具体的实现子类。通常在抽象父类中封装了子类的算法框架，
    * 包括实现一些公共方法和封装子类中所有方法的执行顺序。子类通过继承这个抽象类，也继承了整个算法结构，并且可以选择重写父类的方法。
    * 场景： 一次性实现一个算法的不变的部分，并将可变的行为留给子类来实现
             子类中公共的行为应被提取出来并集中到一个公共父类中的避免代码重复
             * 提取了公共代码部分，易于维护
    * */
    main() {
      class Beverage {
        constructor({brewDrink, addCondiment}) {
          this.brewDrink = brewDrink
          this.addCondiment = addCondiment
        }
        /* 烧开水，共用方法 */
        boilWater() { console.log('水已经煮沸=== 共用') }
        /* 倒杯子里，共用方法 */
        pourCup() { console.log('倒进杯子里===共用') }
        /* 模板方法 */
        init() {
          this.boilWater()
          this.brewDrink()
          this.pourCup()
          this.addCondiment()
        }
      }
      /* 咖啡 */
      const coffee = new Beverage({
        /* 冲泡咖啡，覆盖抽象方法 */
        brewDrink: function() { console.log('冲泡咖啡') },
        /* 加调味品，覆盖抽象方法 */
        addCondiment: function() { console.log('加点奶和糖') }
      })
      coffee.init()
    }
  }
}
</script>

<style scoped>

</style>
